﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormsApp1;

public partial class Form5 : Form
{
    public Form5()
    {
        InitializeComponent();
    }

    private TcpListener _tcpListener;
    private CancellationTokenSource _cancellationTokenSource;
    private readonly int _port = 5000;

    private void button1_Click(object sender, EventArgs e)
    {
        //
        StartServer();
    }

    private void StartServer()
    {
        _cancellationTokenSource = new CancellationTokenSource();
        _tcpListener = new TcpListener(IPAddress.Any, _port);
        _tcpListener.Start();
        Task.Run(() => AcceptClientsAsync(_cancellationTokenSource.Token));
        MessageBox.Show("服务器已启动");
    }

    private async Task AcceptClientsAsync(CancellationToken cancellationToken)
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            try
            {
                var client = await _tcpListener.AcceptTcpClientAsync();
                _ = Task.Run(() => HandleClientAsync(client, cancellationToken));
            }
            catch (Exception ex)
            {
                // 处理异常
                MessageBox.Show($"异常: {ex.Message}");
            }
        }
    }

    private async Task HandleClientAsync(TcpClient client, CancellationToken cancellationToken)
    {
        var buffer = new byte[1024];
        var stream = client.GetStream();

        while (!cancellationToken.IsCancellationRequested)
        {
            try
            {
                var byteCount = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken);
                if (byteCount <= 0)
                {
                    break;
                }

                var message = Encoding.UTF8.GetString(buffer, 0, byteCount);
                // 处理接收到的消息
                //   MessageBox.Show($"接收到消息: {message}");

                // 回应客户端
                var response = Encoding.UTF8.GetBytes("消息已收到");
                await stream.WriteAsync(response, 0, response.Length, cancellationToken);
            }
            catch (Exception ex)
            {
                // 处理异常
                MessageBox.Show($"异常: {ex.Message}");
                break;
            }
        }

        client.Close();
        MessageBox.Show($"连接关闭");
    }
}